/*
 * Partida.cpp
 *
 *  Created on: 28/06/2014
 *      Author: loreyalan
 */

#include "Partida.h"

Partida *Partida::instance = NULL;

/* Mapa de comandos */
map<short int, ComandoServidor *> mapaComandos;
/* Mapa de sprites por elemento */
SDL_Rect *vectorSprites[256];
SDL_Rect vectorElementos[256];


/* Funciones */

/* Cargan los mapas necesarios para el juego */
void cargarMapaComandos();
void cargarMapaSprites();
void cargarVectoresElementos();

/* Convierte un idimagen de numero en una constante */
unsigned int Partida::obtenerNumero(unsigned char letra)
{

    switch (letra)
                {
                 case CERO:  return CONST_CERO; break;
                 case UNO:  return CONST_UNO; break;
                 case DOS:  return CONST_DOS; break;
                 case TRES:  return CONST_TRES; break;
                 case CUATRO:  return CONST_CUATRO; break;
                 case CINCO:  return CONST_CINCO; break;
                 case SEIS:  return CONST_SEIS; break;
                 case SIETE:  return CONST_SIETE; break;
                 case OCHO:  return CONST_OCHO; break;
                 case NUEVE:  return CONST_NUEVE; break;
                }
    return VACIO;
}

/* Obtengo el numero de nivel actual*/
unsigned int Partida::obtenerNivel(){
    unsigned int nivel;
    //Niveles del 1 al 99
    nivel = obtenerNumero(matriz[52][0].nombre)*10 + obtenerNumero(matriz[52][1].nombre);
    return nivel;
}

//// Convierte String a mayusculas ////////////////////////////////////////////
string upcase(string s1){
  string tmp=s1;
  for (unsigned short int i=0; i < s1.size(); i++)
     tmp.at(i) = toupper(tmp.at(i));
  return tmp;
}

///// Corrijo los caracteres del nombre (solo letras y mayusculas) ////////////////////
string corregirNombre(string nombre){
	string correctos="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	string aux="";

	for (unsigned short int j=0;j<=3;j++) //maximo 4 caracteres
		for (unsigned short int i=0;i<correctos.size();i++)
			if(nombre[j]==correctos[i])
				aux+=nombre[j];

	//Convierto a mayusculas
	string nombreMayuscula;
	nombreMayuscula=upcase(aux);

	return nombreMayuscula;
}

// A partir de un char te devuelve el id_image del caracter */
unsigned char obtenerIdCaracter(unsigned short int jugador,char letra)
{
switch (jugador)
      {
       case 1:
       	 switch (letra)
       	        {
       	         case 'A':  return A1; break;
       	         case 'B':  return B1; break;
       	         case 'C':  return C1; break;
       	         case 'D':  return D1; break;
       	         case 'E':  return E1; break;
       	         case 'F':  return F1; break;
       	         case 'G':  return G1; break;
       	         case 'H':  return H1; break;
       	         case 'I':  return I1; break;
       	         case 'J':  return J1; break;
       	         case 'K':  return K1; break;
       	         case 'L':  return L1; break;
       	         case 'M':  return M1; break;
       	         case 'N':  return N1; break;
                 case 'O':  return O1; break;
       	         case 'P':  return P1; break;
       	         case 'Q':  return Q1; break;
       	         case 'R':  return R1; break;
       	         case 'S':  return S1; break;
       	         case 'T':  return T1; break;
       	         case 'U':  return U1; break;
       	         case 'V':  return V1; break;
       	         case 'W':  return W1; break;
       	         case 'X':  return X1; break;
       	         case 'Y':  return Y1; break;
       	         case 'Z':  return Z1; break;
       	        }
              break;
       	 case 2:
       	 switch (letra)
       	 {
       	 case 'A':  return A2; break;
       	 case 'B':  return B2; break;
       	 case 'C':  return C2; break;
       	 case 'D':  return D2; break;
       	 case 'E':  return E2; break;
       	 case 'F':  return F2; break;
       	 case 'G':  return G2; break;
       	 case 'H':  return H2; break;
       	 case 'I':  return I2; break;
       	 case 'J':  return J2; break;
       	 case 'K':  return K2; break;
       	 case 'L':  return L2; break;
       	 case 'M':  return M2; break;
       	 case 'N':  return N2; break;
       	 case 'O':  return O2; break;
       	 case 'P':  return P2; break;
       	 case 'Q':  return Q2; break;
       	 case 'R':  return R2; break;
       	 case 'S':  return S2; break;
       	 case 'T':  return T2; break;
       	 case 'U':  return U2; break;
       	 case 'V':  return V2; break;
       	 case 'W':  return W2; break;
       	 case 'X':  return X2; break;
       	 case 'Y':  return Y2; break;
       	 case 'Z':  return Z2; break;
       	        }
              break;

      }

switch (letra)
       	        {
       	         case '0':  return CERO; break;
       	         case '1':  return UNO; break;
       	         case '2':  return DOS; break;
       	         case '3':  return TRES; break;
       	         case '4':  return CUATRO; break;
       	         case '5':  return CINCO; break;
       	         case '6':  return SEIS; break;
       	         case '7':  return SIETE; break;
       	         case '8':  return OCHO; break;
       	         case '9':  return NUEVE; break;
       	        }
return VACIO;
}

/* A partir de un numero te devuelve el id_image */
unsigned char obtenerIdNumero(unsigned short int numero){
	switch (numero)
	       	        {
	       	         case 0:  return CERO; break;
	       	         case 1:  return UNO; break;
	       	         case 2:  return DOS; break;
	       	         case 3:  return TRES; break;
	       	         case 4:  return CUATRO; break;
	       	         case 5:  return CINCO; break;
	       	         case 6:  return SEIS; break;
	       	         case 7:  return SIETE; break;
	       	         case 8:  return OCHO; break;
	       	         case 9:  return NUEVE; break;
	       	        }
	return VACIO;
}

/* A partir de un id_image te devuelve el char del numero */
short int obtenerNumeroId(unsigned char numero){
	switch (numero)
	       	        {
	       	         case CERO:  return 0; break;
	       	         case UNO:  return 1; break;
	       	         case DOS:  return 2; break;
	       	         case TRES:  return 3; break;
	       	         case CUATRO:  return 4; break;
	       	         case CINCO:  return 5; break;
	       	         case SEIS:  return 6; break;
	       	         case SIETE:  return 7; break;
	       	         case OCHO:  return 8; break;
	       	         case NUEVE:  return 9; break;
	       	        }
	return 0;
}

// Cargo el puntaje del Jugador en la matriz //////////////////////////
void Partida::cargarPuntaje(string punt, unsigned short int jugador){
	if(jugador==JUGADOR1){//Jugador 1
		for (unsigned short int j=0;j<7;j++) //maximo 7 digitos
			matriz[45][j].nombre=obtenerIdCaracter(1,punt[j]);
		for(unsigned short int j=0; j<7;j+=1){
			matriz[45][j].destino.x= 114+17*j;
			matriz[45][j].destino.y=60;
		}
	}else{ //Jugador 2
	 for (unsigned short int j=0;j<7;j++) //maximo 7 digitos
	   matriz[47][j].nombre=obtenerIdCaracter(2,punt[j]);
	 for(unsigned short int j=0; j<7;j+=1){
		matriz[47][j].destino.x= 570+17*j;
		matriz[47][j].destino.y=60;
	  }
	}
}

// Cargo las vidas del Jugador en la matriz //////////////////////////
void Partida::cargarVidas(unsigned char vidas, unsigned short int jugador){
	if(jugador==JUGADOR1){//Jugador 1
		matriz[48][0].nombre=vidas;
		matriz[48][0].destino.x= 318;
		matriz[48][0].destino.y=39;
	}else {//Jugador 2
		matriz[49][0].nombre=vidas;
		matriz[49][0].destino.x= 516;
		matriz[49][0].destino.y=39;
	}
}


// Dado un IdEntidad y el tramo actual del nivel devuelve la coordenada x(fila) y(columna)
// en donde se encuentra dentro de la matriz de entidades
SDL_Rect idEntidadToXy(unsigned short int id_entidad, unsigned short int tramo)
{
SDL_Rect coordenada;
 switch (id_entidad)
    {
     case ID_DONKEY:     coordenada.x=43; coordenada.y=2; break;
     case ID_MARIO1:    coordenada.x=43; coordenada.y=0; break;
     case ID_MARIO2:    coordenada.x=43; coordenada.y=1; break;
     case ID_FUEGO:    coordenada.x=43; coordenada.y=4; break;
     case ID_MARTILLO:     coordenada.x=43; coordenada.y=3; break;
     case ID_BARRIL0: coordenada.x=43; coordenada.y=5; break;
     case ID_BARRIL1: coordenada.x=43; coordenada.y=6; break;
     case ID_BARRIL2: coordenada.x=43; coordenada.y=7; break;
     case ID_BARRIL3: coordenada.x=43; coordenada.y=8; break;
     case ID_BARRIL4: coordenada.x=43; coordenada.y=9; break;

    }
return coordenada;
}


/* Convierte a char constantes */
char obtenerCaracter(unsigned char idCaracter){
 switch (idCaracter)
    {
     case CERO:   return '0'; break;
     case UNO:    return '1'; break;
     case DOS:    return '2'; break;
     case TRES:   return '3'; break;
     case CUATRO: return '4'; break;
     case CINCO:  return '5'; break;
     case SEIS:   return '6'; break;
     case SIETE:  return '7'; break;
     case OCHO:   return '8'; break;
     case NUEVE:  return '9'; break;
    }
 return '0';
}

// Obtengo el puntaje del jugador ////////////////////////////
string Partida::obtenerPuntaje(unsigned short int jugador){
	string puntaje="";

	if(jugador==JUGADOR1){//Jugador 1
	 for (unsigned short int j=0;j<7;j++)
		 puntaje+=obtenerCaracter(matriz[45][j].nombre);

	}
	else{ //Jugador 2
	 for (unsigned short int j=0;j<7;j++)
		 puntaje+=obtenerCaracter(matriz[47][j].nombre);
	}

	return puntaje;
}

// Incremento el puntaje del jugador ///////////////////////////
void incrementarPuntaje(string *puntaje, int puntajeVidrioReparado){
	int bonus=puntajeVidrioReparado;
	int p;
	string aux=*puntaje;
	p=atoi(aux.c_str())+bonus;

	stringstream stream;
	stream << p;
	aux = stream.str();

	string aux2="";
	for(unsigned short int i=0;i<(7-aux.size());i++)
	  aux2+="0";
	aux2+=aux;

	*puntaje=aux2;
}
////////// Devuelve la coordenada de un sprite dentro de la imagen //////////////////////
SDL_Rect Partida::obtenerOrigenSprite(unsigned char nombre){
	return *(vectorSprites[nombre]);
}

Partida::Partida() {
	/* Mutex */
	mutexPantalla = new ThreadMutex();
	mutexColaAccionesAEjecutar= new ThreadMutex();
	mutexColaAccionesAEnviar= new ThreadMutex();
	mutexHayQueEjecutar= new ThreadMutex();
	mutexHayQueEnviar= new ThreadMutex();

	/* Cargo los mapas necesarios para el juego */
	cargarMapaComandos();
	cargarMapaSprites();
	cargarVectoresElementos();

	/* Arrancan tomados */
	mutexHayQueEnviar->P();
	mutexHayQueEjecutar->P();

	tramo = CONST_UNO;
	stoped = CONST_TRUE;
	finTorneo = CONST_FALSE;
	finError  = CONST_FALSE;
	miIdJugador   =CONST_UNO;
	estoyVivo     =CONST_TRUE;
	vaciarMatriz();
}

Partida::~Partida() {
	// TODO Auto-generated destructor stub
}

/*Retorna la instancia si existe, sino la crea y la retorna.*/
Partida *Partida::getInstance(){
	if(!instance)
		instance = new Partida();

	return instance;
}

/* Getters */
bool Partida::isActivo(){
	return instance->activo;
}

/* Retorna si la partida esta parada o no */
bool Partida::isStoped(){
	return instance->stoped;
}

/* Retorna si ya finalizo el torneo */
bool Partida::isFinTorneo(){
	return instance->finTorneo;
}

/* Retorna si el torneo termino con errores */
bool Partida::isFinError(){
	return instance->finError;
}

/* Devuelve en una string el ranking del jugador propio */
string Partida::getRankingJugador(){
	short int decenas = 0;
	short int unidades = 0;

	/* Me fijo el puntaje, si soy jugador 1 o 2 cambia */
	if(instance->miIdJugador == ID_MARIO1){
		decenas  = obtenerNumeroId(matriz[50][0].nombre);//decenas
		unidades = obtenerNumeroId(matriz[50][1].nombre);//unidades
	}else{
		decenas  = obtenerNumeroId(matriz[51][0].nombre);//decenas
		unidades = obtenerNumeroId(matriz[51][1].nombre);//unidades
	}

	ostringstream ss;
	ss << decenas << unidades << '\0';

	return ss.str();
}


/* Setters */
void Partida::setMiNombre(char *miNombre){
	instance->miNombre = miNombre;
}

void Partida::setControles(map<int, int> *controles){
	instance->controles = controles;
}

void Partida::setPantallaBase(SDL_Surface *pantallaBase){
	instance->pantallaBase = pantallaBase;
}

void Partida::setImagen1(SDL_Surface *imagen1){
	instance->imagen1 = imagen1;
}

void Partida::setActivo(bool activo){
	instance->activo = activo;
}

void Partida::setImagen2(SDL_Surface *imagen2){
	instance->imagen2 = imagen2;
}

void Partida::setStoped(bool stoped){
	instance->stoped = stoped;
}

/* Agrega la t_accion recibida por parámetro, a la cola de acciones a ejecutar. */
void Partida::encolarAccionAEjecutar(t_accion action){
	bool liberar;

	if(instance->colaAccionesAEjecutar.empty())
		liberar = CONST_TRUE;

	//Encolo la t_accion.
	instance->mutexColaAccionesAEjecutar->P();
	instance->colaAccionesAEjecutar.push(action);
	instance->mutexColaAccionesAEjecutar->V();

	//Si es el primero que cargo, libero el mutex. d
	if(liberar)
		instance->mutexHayQueEjecutar->V();
}

/* Va sacando de la cola de acciones, para ejecutarlas. */
t_accion Partida::desencolarAccionAEjecutar(){
	t_accion a;

	//Espero a que halla acciones encoladas.
	instance->mutexHayQueEjecutar->P();

	//Cuando hay, desencolo.
	instance->mutexColaAccionesAEjecutar->P();
	a = instance->colaAccionesAEjecutar.front();
	instance->colaAccionesAEjecutar.pop();
	instance->mutexColaAccionesAEjecutar->V();

	//Si no quedan mas datos, lo dejo tomado hasta que el que carge la cola lo libere.
	if(!instance->colaAccionesAEjecutar.empty())
		instance->mutexHayQueEjecutar->V();

	return a;
}

/* Agrega la t_accion recibida por parámetro, a la cola de acciones a ejecutar. */
void Partida::encolarAccionAEnviar(t_accion action){
	bool liberar;
	if(instance->colaAccionesAEnviar.empty())
		liberar = CONST_TRUE;

	//Encolo la t_accion.
	instance->mutexColaAccionesAEnviar->P();
	instance->colaAccionesAEnviar.push(action);
	instance->mutexColaAccionesAEnviar->V();

	//Si es el primero que cargo, libero el mutex. d
	if(liberar)
		instance->mutexHayQueEnviar->V();
}

/* Va sacando de la cola de acciones, para ejecutarlas. */
t_accion Partida::desencolarAccionAEnviar(){
	t_accion a;

	//Espero a que halla acciones encoladas.
	instance->mutexHayQueEnviar->P();

	//Cuando hay, desencolo.
	instance->mutexColaAccionesAEnviar->P();
	a = instance->colaAccionesAEnviar.front();
	instance->colaAccionesAEnviar.pop();
	instance->mutexColaAccionesAEnviar->V();

	//Si no quedan mas datos, lo dejo tomado hasta que el que carge la cola lo libere.
	if(!instance->colaAccionesAEnviar.empty())
		instance->mutexHayQueEnviar->V();

	return a;
}

/* Desencola una accion a ejecutar, y la ejecuta impactando en la matriz de display */
void Partida::procesarAccion(){
    t_accion action = desencolarAccionAEjecutar();
    if(action.id_accion> 0  && action.id_accion < 24){
		ComandoServidor *cS = mapaComandos[action.id_accion];
		cS->execute(&action);
    }
}

/* Funcion que toma el proximo ingreso de tecla y lo encola para ser enviado al servidor.*/
void Partida::tomarAccionPresionada(){
	/* Se queda bloqueado esperando la tecla */
	t_accion action = instance->getTeclaPresionada();

	if(Partida::getInstance()->isActivo() && !Partida::getInstance()->isStoped() && action.id_entidad != -1)
		/* Encolo la accion de la tecla presionada */
 		instance->encolarAccionAEnviar(action);
	else if(action.id_accion == ACC_SALIR_JUEGO){
		Partida::getInstance()->setActivo(CONST_FALSE);
		Partida::getInstance()->setStoped(CONST_TRUE);
	}
}

/* Funcionalidades */

/* Recibe las teclas ingresadas por el jugador y genera las acciones a encolar pertinenetes */
t_accion Partida::getTeclaPresionada(){
	//TODO: Acciones SDL_Key
	t_accion accion;
	accion.id_entidad = -1;
	SDL_Event event;
	SDL_WaitEvent(&event); //Se bloquea esperando un evento
	//SDL_PollEvent(&event); //No se bloquea

	switch(event.type){
	case SDL_QUIT:
		accion.id_accion = ACC_SALIR_JUEGO;
		accion.id_entidad= instance->miIdJugador;
		break;

	case SDL_KEYDOWN:
	   accion = procesarEventoSDLKeyDown(&event);
	   break;
	}

	return accion;
}

/* Metodo que interpreta el evento SDL_Event de teclado */
t_accion Partida::procesarEventoSDLKeyDown(SDL_Event *event) {
	t_accion accion;
	accion.id_entidad = -1;

	/* Si presiono escape, ejecuta la accion salir del juego */
	if(event->key.keysym.sym == SDLK_ESCAPE){
		//Salir torneo
		accion.id_accion  = ACC_SALIR_JUEGO;
		accion.id_entidad = instance->miIdJugador;
		return accion;

	}else if(estoyVivo == CONST_TRUE){
		/* Analizao la tecla presionada */
		switch( (*controles)[event->key.keysym.sym] ){
		case UP:
			/* Envio la accion se moverse para arriba */
			accion.id_accion	= ACC_MOVER;
			accion.id_entidad	= miIdJugador;
			accion.mov_x	 	= CONST_CERO;
			accion.mov_y	 	= CONST_MENOS_UNO * ANCHO_MOV_Y_MARIO;
			break;

		case DOWN:
			/* Envio la accion se moverse para abajo */
			accion.id_accion	= ACC_MOVER;
			accion.id_entidad	= miIdJugador;
			accion.mov_x	 	= CONST_CERO;
			accion.mov_y	 	= ANCHO_MOV_Y_MARIO;
			break;

		case RIGHT:
			/* Envio la accion para moverse a la derecha */
			accion.id_accion	= ACC_MOVER;
			accion.id_entidad	= miIdJugador;
			accion.mov_x		= ANCHO_MOV_X_MARIO;
			accion.mov_y		= CONST_CERO;
			break;

		case LEFT:
			/* Envio la accion para moverse a la derecha */
			accion.id_accion	= ACC_MOVER;
			accion.id_entidad	= miIdJugador;
			accion.mov_x		= CONST_MENOS_UNO * ANCHO_MOV_X_MARIO;
			accion.mov_y		= CONST_CERO;
			break;
		}
	}

	return accion;
}

/* Funcion que ejecuta la actualizacion de la informacion en la pantalla */
void Partida::refreshDisplay(){
	/* Tomo el mutex */
	mutexPantalla->P();

	//Borro pantalla
	SDL_Rect PosScr;
	PosScr.x = 0;
	PosScr.y = 0;
	PosScr.w = pantallaBase -> w;
	PosScr.h = pantallaBase -> h;
	SDL_FillRect( pantallaBase, &PosScr, SDL_MapRGB( pantallaBase -> format, 0, 0, 0) );

	SDL_Rect aux,aux2;

	aux=*vectorSprites[matriz[0][0].nombre];
	aux2=matriz[0][0].destino;
	SDL_BlitSurface(imagen1, &aux, pantallaBase, &aux2);


	// Actualizo la superficie principal
	SDL_Flip(pantallaBase);

	//Actualizo toda la superficie
	//SDL_UpdateRect(pantallaBase, 0, 0, 0, 0);

	/* Lo libero*/
	mutexPantalla->V();
	//TODO: Ver como queda esto.
}

/* Metodo que ejecuta las acciones iniciales de la partida y del display, antes de recibir acciones del servidor*/
void Partida::iniciarPartida(){
	instance->activo = CONST_TRUE;
	instance->stoped = CONST_TRUE;
}

/* Acciones */

/* Metodo para la accion ACC_MOVER, y mover el objeto con id:id y en el sentido sentido que la accion lo indique. */
int Partida::move(t_accion *accion){
	//Obtengo la coordenada dentro de la matriz del elemento a mover
	SDL_Rect coordenada=vectorElementos[accion->id_entidad];
						//idEntidadToXy(accion->id_entidad, instance->tramo); TODO

	instance->mutexPantalla->P();

	//Incremento la coordenada en x y la coordenada en y del elemento
    matriz[coordenada.x][coordenada.y].destino.x=accion->mov_x;
    matriz[coordenada.x][coordenada.y].destino.y=accion->mov_y;

	instance->mutexPantalla->V();

	return CONST_UNO;
}

/* Metodo para eliminar un ave */
bool Partida::deleteFuego(t_accion *action){
	//Obtengo la coordenada dentro de la matriz
	SDL_Rect coordenada=vectorElementos[ID_FUEGO];

	instance->mutexPantalla->P();

	matriz[coordenada.x][coordenada.y].nombre    = VACIO;
	matriz[coordenada.x][coordenada.y].destino.x=0;
    matriz[coordenada.x][coordenada.y].destino.y=0;

	instance->mutexPantalla->V();

	return CONST_TRUE;
}

/* Metodo para eliminar una torta */
bool Partida::deleteMartillo(t_accion *action){
	//Obtengo la coordenada dentro de la matriz del martillo a reparar
	//SDL_Rect coordenada=idEntidadToXy(action->id_entidad, tramo);
	SDL_Rect coordenada=vectorElementos[ID_MARTILLO];

	instance->mutexPantalla->P();

	matriz[coordenada.x][coordenada.y].nombre=VACIO;

	instance->mutexPantalla->V();

	return CONST_TRUE;
}

/* Metodo para la accion ACC_CONSUMIR_MARTILLO, da inmunidad al Mario indicado en id_entidad */
bool Partida::consumirMartillo(t_accion *action){
	//Obtengo la coordenada dentro de la matriz del mario a modificar
	//SDL_Rect coordenada=idEntidadToXy(action->id_entidad, 1); TODO
	SDL_Rect coordenada=vectorElementos[action->id_entidad];

	instance->mutexPantalla->P();

	matriz[coordenada.x][coordenada.y].nombre=MARIO_INMUNE;

	instance->mutexPantalla->V();

	return CONST_TRUE;
}
/* Metodo para eliminar un ladrillo */
bool Partida::deleteBarril(t_accion *action){
	//SDL_Rect coordenada=idEntidadToXy(action->id_entidad, tramo); TODO
	SDL_Rect coordenada=vectorElementos[action->id_entidad];

	instance->mutexPantalla->P();
	//Borro campo nombre para que no se dibuje
	matriz[coordenada.x][coordenada.y].nombre=VACIO;
	instance->mutexPantalla->V();

	return CONST_TRUE;
}

/* Pasa al siguiente tramo */
bool Partida::finalizarTramo(t_accion *action){
	int scrollV=333;
	//Desplazo el dibujo verticalmente
	for(int i=0; i<=41;i++)
	  for(int j=0;j<=9;j++)
		 matriz[i][j].destino.y+=scrollV;

	 if(matriz[42][4].destino.y>14)
	  {
		 matriz[42][4].destino.y-= 9;
		 matriz[43][7].destino.y-= 111*3;
	  }
	 if(matriz[42][5].destino.y>14)
	  {
		 matriz[42][5].destino.y-= 9;
		 matriz[43][8].destino.y-= 111*3;
	  }
	return CONST_TRUE;
}

/* Pasa al siguiente nivel. */
bool Partida::finalizarNivel(t_accion *action){
	   unsigned int nivel=obtenerNivel();
	   nivel++;
	   matriz[52][0].nombre=obtenerIdNumero(nivel/10);//decenas
	   matriz[52][1].nombre=obtenerIdNumero(nivel%10);//unidades
	return CONST_TRUE;
}

/* Felix perdio las 3 vidas */
bool Partida::perderPartida(t_accion *action){

	 SDL_Rect coordenada1=idEntidadToXy(action->id_entidad, tramo);

	 instance->mutexPantalla->P();

	 //Borro campo nombre para que no se dibuje
	 matriz[coordenada1.x][coordenada1.y].nombre=VACIO;

	 instance->mutexPantalla->V();

	 if(action->id_entidad == miIdJugador)
	   estoyVivo=false;

	return CONST_TRUE;
}

// Obtengo las vidas del jugador ////////////////////////////
unsigned char Partida::obtenerVidas(unsigned short int jugador)
{
unsigned char vidas;
if(jugador==JUGADOR1) //Jugador Local
{
  vidas=matriz[48][0].nombre;

}
else //Jugador Visitante
{
 vidas=matriz[49][0].nombre;
}
return vidas;
}

/* Felix pierde una vida */
bool Partida::restarVida(t_accion *action){
	unsigned char vidas;

	instance->mutexPantalla->P();

	if(action->id_entidad==ID_MARIO1){
		//Le quito una vida
		vidas=obtenerVidas(JUGADOR1);
		decrementarVidas(&vidas);
		cargarVidas(vidas,JUGADOR1);
		//Lo vuelvo a la posicion inicial
		//Posicion inicial de Felix 1 en la pantalla
		matriz[43][0].destino.x= 228; matriz[43][0].destino.y=419;
		//Posicion inicial de Felix 1 dentro de la matriz
		matriz[42][4].destino.x= 0; matriz[42][4].destino.y=40;
		//IDVidrio en el que esta Felix 1 dentro de la matriz
		matriz[42][7].destino.x= 0;
	}else{
		//Le quito una vida
		vidas=obtenerVidas(JUGADOR2);
		decrementarVidas(&vidas);
		cargarVidas(vidas,JUGADOR2);
		//Lo vuelvo a la posicion inicial
		//Posicion inicial de Felix 2 en la pantalla
		matriz[43][1].destino.x= 512; matriz[43][1].destino.y=419;
		//IDVidrio en el que esta Felix 2 dentro de la matriz
		matriz[42][8].destino.x= 4;
		//Posicion inicial de Felix 2 dentro de la matriz
		matriz[42][5].destino.x= 8; matriz[42][5].destino.y=40;
	}

	instance->mutexPantalla->V();

	return CONST_TRUE;
}
// Decremento las vidas del jugador ///////////////////////////
void Partida::decrementarVidas(unsigned char *vidas){
	*vidas=*vidas-1;
}

/* Termina el torneo, esperando a que finalice la partida para salir */
bool Partida::finalizarTorneo(t_accion *action){
	/* Enciendo el flag de fin de torneo */
	instance->finTorneo = CONST_TRUE;

	/* Si llega mov_x en 1 es porque hubo un error, asi que finalizo de inmediato */
	if(action->mov_x == CONST_UNO){
		instance->activo = CONST_FALSE;
		instance->finError  = CONST_TRUE;
	}

	return CONST_TRUE;
}


/* Termina la partida. */
bool Partida::finalizarPartida(t_accion *action){
	// TODO: Ver como finalizar...
	instance->stoped = CONST_TRUE;
	return CONST_TRUE;
}

/* Ejecuta la accion de quitar a un jugador del juego y de la partida */
bool Partida::salirDelJuego(t_accion *action){
	//TODO:salirDelJuego
	instance->mutexPantalla->P();
	if(action->id_entidad == miIdJugador){
		instance->stoped = CONST_TRUE;
		instance->activo = CONST_FALSE;
	}else{
		/* Obtengo las coordenadas en la matriz */
		SDL_Rect coordenada1=idEntidadToXy(action->id_entidad, tramo);
		/* Borro campo nombre para que no se dibuje */
		matriz[coordenada1.x][coordenada1.y].nombre=VACIO;
	}
	instance->mutexPantalla->V();

	return CONST_TRUE;
}

/* Metodo que interpreta la accion crear ave y activa un ave en la pos x,y indicada en la accion */
bool Partida::crearFuego(t_accion *action){
	/*Obtengo la coordenada dentro de la matriz de la paloma a crear */
	SDL_Rect coordenada=idEntidadToXy(ID_FUEGO, tramo);

	instance->mutexPantalla->P();

	//Ubico la paloma en la posicion indicada en el mensaje
	matriz[coordenada.x][coordenada.y].destino.x = action->mov_x;
	matriz[coordenada.x][coordenada.y].destino.y = action->mov_y;
	matriz[coordenada.x][coordenada.y].nombre    = FUEGO1;

	instance->mutexPantalla->V();

	return CONST_TRUE;
}

/* Metodo que interpreta la accion crear ladrillo */
bool Partida::crearBarril(t_accion *action){
	/*Obtengo la coordenada dentro del ladrillo a crear */
	SDL_Rect coordenada=idEntidadToXy(action->id_entidad, tramo);

	instance->mutexPantalla->P();

	//Ubico el ladrillo en la posicion indicada en el mensaje
	matriz[coordenada.x][coordenada.y].destino.x=action->mov_x;
	matriz[coordenada.x][coordenada.y].destino.y=action->mov_y;
	matriz[coordenada.x][coordenada.y].nombre=BARRIL1;

	instance->mutexPantalla->V();

	return CONST_TRUE;
}

/* Interpreta la accion crear ave */
bool Partida::crearMartillo(t_accion *action){
	//Obtengo la coordenada dentro de la matriz del vidrio donde se creará la torta
	SDL_Rect cVidrio=idEntidadToXy(action->mov_x, tramo);
	SDL_Rect cMartillo=idEntidadToXy(ID_MARTILLO, tramo);

	instance->mutexPantalla->P();

	//Ubico la torta sobre el vidrio indicado
	matriz[cMartillo.x][cMartillo.y].destino.x = matriz[cVidrio.x][cVidrio.y].destino.x;
	matriz[cMartillo.x][cMartillo.y].destino.y = matriz[cVidrio.x][cVidrio.y].destino.y-5;
	matriz[cMartillo.x][cMartillo.y].nombre=MARTILLO1;

	instance->mutexPantalla->V();

	return CONST_TRUE;
}

/* Ejecuta la accion de lanzado de un ladrillo para ralph. */
bool Partida::lanzarBarril(t_accion *action){
	//TODO:
	return CONST_TRUE;
}

/* Inicia el juego */
bool Partida::start(t_accion *action){
	instance->stoped = CONST_FALSE;
	instance->activo = CONST_TRUE;
	return CONST_TRUE;
}

/* Actualiza el puntaje de los jugadores */
bool Partida::actualizarPuntaje(t_accion *accion) {
	string puntaje;
	if(accion->id_entidad==ID_MARIO1){
		//puntaje=obtenerPuntaje(JUGADOR1);
		puntaje="0000000";
		incrementarPuntaje(&puntaje,accion->mov_x);
		cargarPuntaje(puntaje,JUGADOR1);
	}else{
		//puntaje=obtenerPuntaje(JUGADOR2);
		puntaje="0000000";
		incrementarPuntaje(&puntaje,accion->mov_x);
		cargarPuntaje(puntaje,JUGADOR2);
	}

	return CONST_TRUE;
}


/* Actualiza el ranking de los jugadores */
bool Partida::actualizarRanking(t_accion *accion) {
	if(accion->id_entidad==ID_MARIO1){
		//Ranking del 1 al 99
		matriz[50][0].nombre=obtenerIdNumero(accion->mov_x/10);//decenas
		matriz[50][0].destino.x=313;
		matriz[50][0].destino.y=60;
		matriz[50][1].nombre=obtenerIdNumero(accion->mov_x%10);//unidades
		matriz[50][1].destino.x=331;
		matriz[50][1].destino.y=60;
	}else{
		//Ranking del 1 al 99
		matriz[51][0].nombre=obtenerIdNumero(accion->mov_x/10);//decenas
		matriz[51][0].destino.x=508;
		matriz[51][0].destino.y=60;
		matriz[51][1].nombre=obtenerIdNumero(accion->mov_x%10);//unidades
		matriz[51][1].destino.x=526;
		matriz[51][1].destino.y=60;
	}

	return CONST_TRUE;
}

/* Inicia la partida en el juego */
bool Partida::inicializarPartida(t_accion *accion){
	/* Inicializa la matriz */
	instance->vaciarMatriz();

	/* Tomo el mutex */
	instance->mutexPantalla->P();

	//Obtengo que jugador soy, el 1 o el 2
	miIdJugador=accion->id_entidad;

	//Obtengo el nombre del otro jugador
	string nombreOtroJugador="";
	for (unsigned short int i=0;i<=3;i++)
		nombreOtroJugador+=accion->msj[i];

	//Corrijo el nombre del otro jugador: Solo letras y convertir a mayusculas
	nombreOtroJugador=corregirNombre(nombreOtroJugador);

	//Obtengo el nombre mio
	string nombreMio="";
	for (unsigned short int i=0;i<=instance->miNombre.length();i++)
	  nombreMio+=miNombre[i];

	//Corrijo mi nombre: Solo letras y convertir a mayusculas
	nombreMio=corregirNombre(nombreMio);

	if(miIdJugador==ID_MARIO1){ //Jugador Local
	  cargarNombre(nombreMio, JUGADOR1);
	  cargarNombre(nombreOtroJugador, JUGADOR2);
	}
	else{
	  cargarNombre(nombreMio, JUGADOR2);
	  cargarNombre(nombreOtroJugador, JUGADOR1);
	}

	//Cargo puntaje inicial de los jugadores//////////////////////////
	string puntaje="0000000";
	cargarPuntaje(puntaje, JUGADOR1);
	puntaje="0000000";
	cargarPuntaje(puntaje, JUGADOR2);

	/* Cargo vidas iniciales a los jugadores */
	cargarVidas(TRES, CONST_UNO);
	cargarVidas(TRES, CONST_DOS);

	/*Cargo felix */
	estoyVivo = CONST_TRUE;

	//Posicion inicial de Felix 1 en la pantalla
	matriz[43][0].nombre=MARIO1;
	//Posicion inicial de Felix 2 en la pantalla
	matriz[43][1].nombre=MARIO2;

	/* Lo libero */
	instance->mutexPantalla->V();

	return CONST_TRUE;
}

/* Metodo que inicializa el nivel en la pantalla del jugador */
void Partida::inicializarNivel(t_accion *accion){

	/* Tomo el mutex */
	instance->mutexPantalla->P();

	//Niveles del 1 al 99
	matriz[52][0].nombre=obtenerIdNumero(accion->id_entidad/10);//decenas
	matriz[52][0].destino.x=382;matriz[52][0].destino.y=30;
	matriz[52][1].nombre=obtenerIdNumero(accion->id_entidad%10);//unidades
	matriz[52][1].destino.x=400;matriz[52][1].destino.y=30;

	int desde,sep;

	if(accion->id_entidad==1){//valores segun el numero de tramo en el que estoy
		desde=12;
		sep=-111;
	}else {
		desde=3;
		sep=-444;
	}

	int separacion=sep;

	//Posiciones en pantalla

	//Defino posicion de la puerta y la ventana central
	matriz[39][4].destino.x= 360; matriz[39][4].destino.y= 405;
	matriz[36][4].destino.x= 359; matriz[36][4].destino.y= 332;

	// Defino las posiciones de los bloqueos
	separacion=sep+111;
	for(unsigned short int i=(desde+3); i<=39;i+=3){
	   matriz[i-1][0].destino.x= 236;
	   matriz[i-1][0].destino.y= -473+separacion;
	   matriz[i-1][0].nombre=VACIO;
	   matriz[i][1].destino.x= 280;
	   matriz[i][1].destino.y= -448+separacion;
	   matriz[i][1].nombre=VACIO;
	   matriz[i-1][2].destino.x= 306;
	   matriz[i-1][2].destino.y= -473+separacion;
	   matriz[i-1][2].nombre=VACIO;
	   matriz[i][3].destino.x= 350;
	   matriz[i][3].destino.y= -448+separacion;
	   matriz[i][3].nombre=VACIO;
	   matriz[i-1][4].destino.x= 376;
	   matriz[i-1][4].destino.y= -473+separacion;
	   matriz[i-1][4].nombre=VACIO;
	   matriz[i][5].destino.x= 420;
	   matriz[i][5].destino.y= -448+separacion;
	   matriz[i][5].nombre=VACIO;
	   matriz[i-1][6].destino.x= 446;
	   matriz[i-1][6].destino.y= -473+separacion;
	   matriz[i-1][6].nombre=VACIO;
	   matriz[i][7].destino.x= 490;
	   matriz[i][7].destino.y= -448+separacion;
	   matriz[i][7].nombre=VACIO;
	   matriz[i-1][8].destino.x= 516;
	   matriz[i-1][8].destino.y= -473+separacion;
	   matriz[i-1][8].nombre=VACIO;

	   separacion+=111;
	  }

	matriz[38][5].nombre=VACIO;
	matriz[41][5].nombre=VACIO;

	matriz[37][3].nombre=VACIO;
	matriz[36][5].nombre=VACIO;

	matriz[38][4].nombre=VACIO;
	matriz[40][3].nombre=VACIO;
	matriz[39][5].nombre=VACIO;

	matriz[40][4].nombre=BARRA_INF;
	matriz[40][4].destino.x= 109; matriz[40][4].destino.y=533;

	matriz[0][0].nombre=ESCENARIO;
	matriz[0][0].destino.x= 155; matriz[0][0].destino.y= 70;

	matriz[42][0].nombre=PANEL_SUP;
	matriz[42][0].destino.x= 0; matriz[42][0].destino.y= 0;

	matriz[42][1].nombre=BANDA_NEGRA;
	matriz[42][1].destino.x= 0; matriz[42][1].destino.y=537;

	matriz[42][2].nombre=BARRA_SUP;
	matriz[42][2].destino.x= 110; matriz[42][2].destino.y=86;

	matriz[42][3].nombre=BARRA_SUP;
	matriz[42][3].destino.x= 110; matriz[42][3].destino.y=80;

	//Posicion inicial de Felix 1 en la pantalla
	matriz[43][0].destino.x= 228; matriz[43][0].destino.y=419;

	//Posicion inicial de Felix 1 dentro de la matriz
	matriz[42][4].destino.x= 0; matriz[42][4].destino.y=40;

	//IDVidrio en el que esta Felix 1 dentro de la matriz
	matriz[42][7].destino.x= 0;

	//Posicion inicial de Felix 2 en la pantalla
	matriz[43][1].destino.x= 512; matriz[43][1].destino.y=419;

	//IDVidrio en el que esta Felix 2 dentro de la matriz
	matriz[42][8].destino.x= 4;

	//Posicion inicial de Felix 2 dentro de la matriz
	matriz[42][5].destino.x= 8; matriz[42][5].destino.y=40;

	//Posicion inicial de Ralph
	matriz[43][2].nombre=DONKEY1;
	matriz[43][2].destino.x= 228;
	matriz[43][2].destino.y=52;

	/* Lo libero */
	instance->mutexPantalla->V();
}

/* COsas del display */
void Partida::vaciarMatriz(){
	/* Tomo el mutex */
	mutexPantalla->P();

	for(unsigned short int i=0; i<=52;i++)
	 for(unsigned short int j=0;j<=9;j++)
	  matriz[i][j].nombre=VACIO;

	/* Lo libero*/
	mutexPantalla->V();
}


// Cargo el nombre del Jugador en la matriz //////////////////////////
void Partida::cargarNombre(string nombre, unsigned short int jugador){
	unsigned short int letras=nombre.size();

	if(jugador==JUGADOR1){ //jugador1
	 for (unsigned short int j=0;j<letras;j++)
		 matriz[44][j].nombre=obtenerIdCaracter(1,nombre[j]);

	 for(unsigned short int j=0; j<=9;j+=1){
		 matriz[44][j].destino.x= 117+(220-letras*16+1)/2+16*j;
		 matriz[44][j].destino.y=10;
	 }
	}else {
	  for(unsigned short int j=0;j<letras;j++)
		 matriz[46][j].nombre=obtenerIdCaracter(2,nombre[j]);

	  for(unsigned short int j=0; j<=9;j+=1){
		 matriz[46][j].destino.x= 465+(220-letras*16+1)/2+16*j;
		 matriz[46][j].destino.y=10;
	  }
	}
}

/**
 * Carga el mapa de comandos por accion para cuando se tengan que ejecutar las mismas.
 */
void cargarMapaComandos(){
	/* Comandos */
	mapaComandos[ACC_MOVER] 	   			    = (ComandoServidor *) new ComandoMover();
	mapaComandos[ACC_CREAR_FUEGO]  			    = (ComandoServidor *) new ComandoCrearFuego();
	mapaComandos[ACC_CREAR_BARRIL]		  = (ComandoServidor *) new ComandoCrearBarril();
	mapaComandos[ACC_CREAR_MARTILLO]			    = (ComandoServidor *) new ComandoCrearMartillo();
	mapaComandos[ACC_DELETE_FUEGO] 			    = (ComandoServidor *) new ComandoDeleteFuego();
	mapaComandos[ACC_DELETE_BARRIL] 		= (ComandoServidor *) new ComandoDeleteBarril();
	mapaComandos[ACC_DELETE_MARTILLO]			  = (ComandoServidor *) new ComandoDeleteMartillo();
	mapaComandos[ACC_LANZAR_BARRIL]		  = (ComandoServidor *) new ComandoLanzarBarril();
	mapaComandos[ACC_FIN_TRAMO]				    = (ComandoServidor *) new ComandoFinTramo();
	mapaComandos[ACC_FIN_NIVEL]				    = (ComandoServidor *) new ComandoFinNivel();
	mapaComandos[ACC_FIN_PARTIDA]			    = (ComandoServidor *) new ComandoFinPartida();
	mapaComandos[ACC_INIT_PARTIDA]			  = (ComandoServidor *) new ComandoInitPartida();
	mapaComandos[ACC_INIT_NIVEL]			    = (ComandoServidor *) new ComandoInitNivel();
	mapaComandos[ACC_ACT_RANK]				    = (ComandoServidor *) new ComandoActRanking();
	mapaComandos[ACC_COMENZAR]            = (ComandoServidor *) new ComandoComenzar();
	mapaComandos[ACC_ACT_PUNT]				    = (ComandoServidor *) new ComandoActualizarPuntaje();
	mapaComandos[ACC_CONSUMIR_MARTILLO]		  = (ComandoServidor *) new ComandoConsumirMartillo();
	mapaComandos[ACC_RESTAR_VIDA]			    = (ComandoServidor *) new ComandoRestarVida();
	mapaComandos[ACC_MORIR]					      = (ComandoServidor *) new ComandoMorir();
	mapaComandos[ACC_SALIR_JUEGO]			    = (ComandoServidor *) new ComandoSalirJuego();
	mapaComandos[ACC_FIN_TORNEO]			    = (ComandoServidor *) new ComandoFinTorneo();
}

/**
 * Carga el vector con las posiciones x, y altura y ancho de cada figura dentro del sprite total,
 * para levantarlos a la hora de dibujar.
 */
void cargarMapaSprites(){

	SDL_Rect *origen = new SDL_Rect;
	origen->x = 1035;
	origen->y = 1956;
	origen->w = 581;
	origen->h = 4;
	vectorSprites[BARRA_SUP] = origen; origen = new SDL_Rect;
	origen->x = 1005;
	origen->y = 1227;
	origen->w = 800;
	origen->h = 90;
	vectorSprites[PANEL_SUP] = origen; origen = new SDL_Rect;
	origen->x = 1005;
	origen->y = 1168;
	origen->w = 800;
	origen->h = 90;
	vectorSprites[BANDA_NEGRA] = origen; origen = new SDL_Rect;
	origen->x = 1035;
	origen->y = 1963;
	origen->w = 581;
	origen->h = 4;
	vectorSprites[BARRA_INF] = origen; origen = new SDL_Rect;
	origen->x = 800;
	origen->y = 6;
	origen->w = 23;
	origen->h = 27;
	vectorSprites[MARTILLO1] = origen; origen = new SDL_Rect;
	origen->x = 832;
	origen->y = 6;
	origen->w = 23;
	origen->h = 27;
	vectorSprites[TORTA2] = origen; origen = new SDL_Rect;
	origen->x = 736;
	origen->y = 0;
	origen->w = 25;
	origen->h = 17;
	vectorSprites[BARRIL1] = origen; origen = new SDL_Rect;
	origen->x = 770;
	origen->y = 0;
	origen->w = 25;
	origen->h = 17;
	vectorSprites[BARRIL2] = origen; origen = new SDL_Rect;
	origen->x = 4;
	origen->y = 446;
	origen->w = 31;
	origen->h = 83;
	vectorSprites[MARIO1] = origen; origen = new SDL_Rect;
	origen->x = 0;
	origen->y = 0;
	origen->w = 0;
	origen->h = 0;
	vectorSprites[VACIO] = origen; origen = new SDL_Rect;
	origen->x = 4;
	origen->y = 446;
	origen->w = 31;
	origen->h = 83;
	vectorSprites[MARIO2] = origen; origen = new SDL_Rect;
	origen->x = 742;
	origen->y = 446;
	origen->w = 51;
	origen->h = 83;
	vectorSprites[MARIO_INMUNE] = origen; origen = new SDL_Rect;
	origen->x = 154;
	origen->y = 961;
	origen->w = 123;
	origen->h = 145;
	vectorSprites[DONKEY1] = origen; origen = new SDL_Rect;
	origen->x = 434;
	origen->y = 961;
	origen->w = 123;
	origen->h = 145;
	vectorSprites[DONKEY2] = origen; origen = new SDL_Rect;
	origen->x = 870;
	origen->y = 320;
	origen->w = 43;
	origen->h = 39;
	vectorSprites[FUEGO1] = origen; origen = new SDL_Rect;
	origen->x = 918;
	origen->y = 320;
	origen->w = 43;
	origen->h = 39;
	vectorSprites[FUEGO2] = origen; origen = new SDL_Rect;
	origen->x = 256;
	origen->y = 1936;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[CERO] = origen; origen = new SDL_Rect;
	origen->x = 274;
	origen->y = 1936;
	origen->w = 13;
	origen->h = 15;
	vectorSprites[UNO] = origen; origen = new SDL_Rect;
	origen->x = 288;
	origen->y = 1936;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[DOS] = origen; origen = new SDL_Rect;
	origen->x = 304;
	origen->y = 1936;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[TRES] = origen; origen = new SDL_Rect;
	origen->x = 320;
	origen->y = 1936;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[CUATRO] = origen; origen = new SDL_Rect;
	origen->x = 336;
	origen->y = 1936;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[CINCO] = origen; origen = new SDL_Rect;
	origen->x = 352;
	origen->y = 1936;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[SEIS] = origen; origen = new SDL_Rect;
	origen->x = 368;
	origen->y = 1936;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[SIETE] = origen; origen = new SDL_Rect;
	origen->x = 384;
	origen->y = 1936;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[OCHO] = origen; origen = new SDL_Rect;
	origen->x = 400;
	origen->y = 1936;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[NUEVE] = origen; origen = new SDL_Rect;
	origen->x = 528;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[A1] = origen; origen = new SDL_Rect;
	origen->x = 544;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[B1] = origen; origen = new SDL_Rect;
	origen->x = 560;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[C1] = origen; origen = new SDL_Rect;
	origen->x = 576;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[D1] = origen; origen = new SDL_Rect;
	origen->x = 592;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[E1] = origen; origen = new SDL_Rect;
	origen->x = 608;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[F1] = origen; origen = new SDL_Rect;
	origen->x = 624;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[G1] = origen; origen = new SDL_Rect;
	origen->x = 640;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[H1] = origen; origen = new SDL_Rect;
	origen->x = 658;
	origen->y = 1984;
	origen->w = 13;
	origen->h = 15;
	vectorSprites[I1] = origen; origen = new SDL_Rect;
	origen->x = 672;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[J1] = origen; origen = new SDL_Rect;
	origen->x = 688;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[K1] = origen; origen = new SDL_Rect;
	origen->x = 704;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[L1] = origen; origen = new SDL_Rect;
	origen->x = 720;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[M1] = origen; origen = new SDL_Rect;
	origen->x = 736;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[N1] = origen; origen = new SDL_Rect;
	origen->x = 752;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[O1] = origen; origen = new SDL_Rect;
	origen->x = 768;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[P1] = origen; origen = new SDL_Rect;
	origen->x = 784;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[Q1] = origen; origen = new SDL_Rect;
	origen->x = 800;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[R1] = origen; origen = new SDL_Rect;
	origen->x = 816;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[S1] = origen; origen = new SDL_Rect;
	origen->x = 834;
	origen->y = 1984;
	origen->w = 13;
	origen->h = 15;
	vectorSprites[T1] = origen; origen = new SDL_Rect;
	origen->x = 848;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[U1] = origen; origen = new SDL_Rect;
	origen->x = 864;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[V1] = origen; origen = new SDL_Rect;
	origen->x = 880;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[W1] = origen; origen = new SDL_Rect;
	origen->x = 896;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[X1] = origen; origen = new SDL_Rect;
	origen->x = 914;
	origen->y = 1984;
	origen->w = 13;
	origen->h = 15;
	vectorSprites[Y1] = origen; origen = new SDL_Rect;
	origen->x = 928;
	origen->y = 1984;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[Z1] = origen; origen = new SDL_Rect;
	origen->x = 528;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[A2] = origen; origen = new SDL_Rect;
	origen->x = 256;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[B2] = origen; origen = new SDL_Rect;
	origen->x = 560;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[C2] = origen; origen = new SDL_Rect;
	origen->x = 576;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[D2] = origen; origen = new SDL_Rect;
	origen->x = 592;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[E2] = origen; origen = new SDL_Rect;
	origen->x = 608;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[F2] = origen; origen = new SDL_Rect;
	origen->x = 624;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[G2] = origen; origen = new SDL_Rect;
	origen->x = 640;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[H2] = origen; origen = new SDL_Rect;
	origen->x = 658;
	origen->y = 2000;
	origen->w = 13;
	origen->h = 15;
	vectorSprites[I2] = origen; origen = new SDL_Rect;
	origen->x = 672;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[J2] = origen; origen = new SDL_Rect;
	origen->x = 688;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[K2] = origen; origen = new SDL_Rect;
	origen->x = 704;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[L2] = origen; origen = new SDL_Rect;
	origen->x = 720;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[M2] = origen; origen = new SDL_Rect;
	origen->x = 736;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[N2] = origen; origen = new SDL_Rect;
	origen->x = 752;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[O2] = origen; origen = new SDL_Rect;
	origen->x = 768;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[P2] = origen; origen = new SDL_Rect;
	origen->x = 784;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[Q2] = origen; origen = new SDL_Rect;
	origen->x = 800;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[R2] = origen; origen = new SDL_Rect;
	origen->x = 816;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[S2] = origen; origen = new SDL_Rect;
	origen->x = 834;
	origen->y = 2000;
	origen->w = 13;
	origen->h = 15;
	vectorSprites[T2] = origen; origen = new SDL_Rect;
	origen->x = 848;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[U2] = origen; origen = new SDL_Rect;
	origen->x = 864;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[V2] = origen; origen = new SDL_Rect;
	origen->x = 880;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[W2] = origen; origen = new SDL_Rect;
	origen->x = 896;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[X2] = origen; origen = new SDL_Rect;
	origen->x = 914;
	origen->y = 2000;
	origen->w = 13;
	origen->h = 15;
	vectorSprites[Y2] = origen; origen = new SDL_Rect;
	origen->x = 928;
	origen->y = 2000;
	origen->w = 15;
	origen->h = 15;
	vectorSprites[Z2] = origen; origen = new SDL_Rect;
	origen->x = 750;
	origen->y = 75;
	origen->w = 490;
	origen->h = 520;
	vectorSprites[ESCENARIO] = origen; origen = new SDL_Rect;
}

void cargarVectoresElementos(){
	SDL_Rect coordenada;

	vectorElementos[ID_DONKEY] = coordenada;
	coordenada.x=43;
	coordenada.y=0;
	vectorElementos[ID_MARIO1] = coordenada;
	coordenada.x=43;
	coordenada.y=1;
	vectorElementos[ID_MARIO2] = coordenada;
	coordenada.x=43;
	coordenada.y=4;
	vectorElementos[ID_FUEGO] = coordenada;
	coordenada.x=43;
	coordenada.y=3;
	vectorElementos[ID_MARTILLO] = coordenada;
	coordenada.x=43;
	coordenada.y=5;
	vectorElementos[ID_BARRIL0] = coordenada;
	coordenada.x=43;
	coordenada.y=6;
	vectorElementos[ID_BARRIL1] = coordenada;
	coordenada.x=43;
	coordenada.y=7;
	vectorElementos[ID_BARRIL2] = coordenada;
	coordenada.x=43;
	coordenada.y=8;
	vectorElementos[ID_BARRIL3] = coordenada;
	coordenada.x=43;
	coordenada.y=9;
	vectorElementos[ID_BARRIL4] = coordenada;
}
